﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;

namespace GestorDeFlotas.Core
{
    public class Cliente : Persona
    {
        public bool Activo { get; set; }
        public int CPostal { get; set; }
        
        public Cliente(int ID)
        {
            this.Id = ID;
        }
        public Cliente()
        {
        }
        public Cliente Cargar()
        {
            using (SqlConnection connection = SqlUtils.GetConnection())
            {
                string sql = string.Format("SELECT [cli_nombre],[cli_mail],[cli_dni],[cli_tel],[cli_apellido],[cli_direccion],[cli_codPostal],[cli_fechaNac],[cli_activo]"+
                    "FROM [CRAZY_TAXI].[TL_Clientes] WHERE [cli_codigo] = {0}", this.Id);
                SqlCommand getCliente = SqlUtils.GetNewCommand(sql);
                getCliente.Connection = connection;
                getCliente.Connection.Open();
                SqlDataReader reader = getCliente.ExecuteReader();

                if (reader.HasRows)
                {
                    reader.Read();
                    this.Nombre = reader.GetString(0);
                    this.Mail = reader.GetString(1);
                    this.DNI = Convert.ToInt32(reader.GetDecimal(2));
                    this.Tel = Convert.ToInt32(reader.GetDecimal(3));
                    this.Apellido = reader.GetString(4);
                    this.Direccion = reader.GetString(5);
                    this.CPostal = reader.GetInt32(6);
                    this.Fecha_Nacimiento = reader.GetDateTime(7);
                    this.Activo = reader.GetBoolean(8);
                }
                else
                {
                    throw new Exception(string.Format("No existe un Cliente con código {0}.", this.Id));
                }

                reader.Close();
                return this;
            }
        }
        public void SetInactivo()
        {
            using (SqlConnection connection = SqlUtils.GetConnection())
            {
                string sql = "UPDATE [CRAZY_TAXI].[TL_Clientes] SET cli_activo = 0 WHERE cli_codigo = @CliID";

                // Codigo para borrar el rol de la base
                SqlCommand updateRecord = SqlUtils.GetNewCommand(sql);

                SqlParameter rowParameter = new SqlParameter("@CliID", SqlDbType.Int);
                rowParameter.IsNullable = false;
                rowParameter.Value = this.Id;

                updateRecord.Parameters.Add(rowParameter);
                updateRecord.Connection = connection;
                updateRecord.Connection.Open();
                updateRecord.ExecuteNonQuery();
            }
        }
        
        public void Crear()
        {
            using (SqlConnection connection = SqlUtils.GetConnection())
            {
                connection.Open();
                SqlTransaction transaction = connection.BeginTransaction();

                try
                {
                    CrearCliente(connection, transaction);
                    transaction.Commit();
                }
                catch (Exception)
                {
                    transaction.Rollback();
                    throw;
                }
            }
        }

        private void CrearCliente(SqlConnection connection, SqlTransaction transaction)
        {
            string sql = "INSERT INTO [CRAZY_TAXI].[TL_Clientes]" + 
            "([cli_nombre], [cli_mail], [cli_dni], [cli_tel], [cli_apellido], [cli_direccion], [cli_codPostal], [cli_fechaNac], [cli_activo])" + 
            "VALUES (@Nombre, @Mail, @Dni, @Tel, @Apellido, @Direccion, @CP, @FechaNac, @Activo );  SELECT scope_identity() AS LastID";
            SqlCommand crearCliente = SqlUtils.GetNewCommand(sql);

            SqlParameter paramNombre = new SqlParameter("@Nombre", SqlDbType.VarChar);
            paramNombre.IsNullable = false;
            paramNombre.Value = this.Nombre;

            SqlParameter paramMail = new SqlParameter("@Mail", SqlDbType.VarChar);
            paramMail.IsNullable = true;
            paramMail.Value = this.Mail;

            SqlParameter paramDni = new SqlParameter("@Dni", SqlDbType.Decimal);
            paramDni.IsNullable = false;
            paramDni.Value = this.DNI;
            
            SqlParameter paramTel = new SqlParameter("@Tel", SqlDbType.Decimal);
            paramTel.IsNullable = false;
            paramTel.Value = this.Tel;

            SqlParameter paramApellido = new SqlParameter("@Apellido", SqlDbType.VarChar);
            paramApellido.IsNullable = false;
            paramApellido.Value = this.Apellido;

            SqlParameter paramDireccion = new SqlParameter("@Direccion", SqlDbType.VarChar);
            paramDireccion.IsNullable = false;
            paramDireccion.Value = this.Direccion;

            SqlParameter paramCP = new SqlParameter("@CP", SqlDbType.Int);
            paramCP.IsNullable = false;
            paramCP.Value = this.CPostal;

            SqlParameter paramFechaNac = new SqlParameter("@FechaNac", SqlDbType.DateTime);
            paramFechaNac.IsNullable = false;
            paramFechaNac.Value = this.Fecha_Nacimiento;

            SqlParameter paramActivo = new SqlParameter("@Activo", SqlDbType.Bit);
            paramActivo.IsNullable = false;
            paramActivo.Value = 1;

            crearCliente.Parameters.Add(paramNombre);
            crearCliente.Parameters.Add(paramMail);
            crearCliente.Parameters.Add(paramDni);
            crearCliente.Parameters.Add(paramTel);
            crearCliente.Parameters.Add(paramApellido);
            crearCliente.Parameters.Add(paramDireccion);
            crearCliente.Parameters.Add(paramCP);
            crearCliente.Parameters.Add(paramFechaNac);
            crearCliente.Parameters.Add(paramActivo);

            crearCliente.Connection = connection;
            crearCliente.Transaction = transaction;
            this.Id = Convert.ToInt32(crearCliente.ExecuteScalar());
        }
        
        public void Modificar()
        {
            using (SqlConnection connection = SqlUtils.GetConnection())
            {
                connection.Open();
                SqlTransaction transaction = connection.BeginTransaction();

                try
                {
                    ModificarDatosCliente(connection, transaction);
                    transaction.Commit();
                }
                catch (Exception)
                {
                    transaction.Rollback();
                    throw;
                }
            }
        }

        private void ModificarDatosCliente(SqlConnection connection, SqlTransaction transaction)
        {
            string sql = "UPDATE [CRAZY_TAXI].[TL_Clientes] SET  [cli_nombre] = @Nombre, [cli_mail] = @Mail,[cli_dni] = @Dni,[cli_tel] = @Tel,[cli_apellido] = @Apellido,[cli_direccion] = @Direccion ,"
                + "[cli_codPostal] = @CP ,[cli_fechaNac] = @FechaNac,[cli_activo] = @Activo WHERE [cli_codigo] = @Codigo";
            SqlCommand modificarCliente = SqlUtils.GetNewCommand(sql);

            SqlParameter paramCodigo = new SqlParameter("@Codigo", SqlDbType.VarChar);
            paramCodigo.IsNullable = false;
            paramCodigo.Value = this.Id;

            SqlParameter paramNombre = new SqlParameter("@Nombre", SqlDbType.VarChar);
            paramNombre.IsNullable = false;
            paramNombre.Value = this.Nombre;

            SqlParameter paramMail = new SqlParameter("@Mail", SqlDbType.VarChar);
            paramMail.IsNullable = true;
            paramMail.Value = this.Mail;

            SqlParameter paramDni = new SqlParameter("@Dni", SqlDbType.Decimal);
            paramDni.IsNullable = false;
            paramDni.Value = this.DNI;

            SqlParameter paramTel = new SqlParameter("@Tel", SqlDbType.Decimal);
            paramTel.IsNullable = false;
            paramTel.Value = this.Tel;

            SqlParameter paramApellido = new SqlParameter("@Apellido", SqlDbType.VarChar);
            paramApellido.IsNullable = false;
            paramApellido.Value = this.Apellido;

            SqlParameter paramDireccion = new SqlParameter("@Direccion", SqlDbType.VarChar);
            paramDireccion.IsNullable = false;
            paramDireccion.Value = this.Direccion;

            SqlParameter paramCP = new SqlParameter("@CP", SqlDbType.Int);
            paramCP.IsNullable = false;
            paramCP.Value = this.CPostal;

            SqlParameter paramFechaNac = new SqlParameter("@FechaNac", SqlDbType.DateTime);
            paramFechaNac.IsNullable = false;
            paramFechaNac.Value = this.Fecha_Nacimiento;

            SqlParameter paramActivo = new SqlParameter("@Activo", SqlDbType.Bit);
            paramActivo.IsNullable = false;
            paramActivo.Value = this.Activo;

            modificarCliente.Parameters.Add(paramCodigo);
            modificarCliente.Parameters.Add(paramNombre);
            modificarCliente.Parameters.Add(paramMail);
            modificarCliente.Parameters.Add(paramDni);
            modificarCliente.Parameters.Add(paramTel);
            modificarCliente.Parameters.Add(paramApellido);
            modificarCliente.Parameters.Add(paramDireccion);
            modificarCliente.Parameters.Add(paramCP);
            modificarCliente.Parameters.Add(paramFechaNac);
            modificarCliente.Parameters.Add(paramActivo);
            modificarCliente.Connection = connection;
            modificarCliente.Transaction = transaction;
            modificarCliente.ExecuteNonQuery();
        }

        
    }

}
